package Day_0226.FactoryPattern;

/**
 * @author zxc
 * @date 2023/02/26 20:27
 **/
public class AbstractFactoryPattern {
    public static void main(String[] args) {
        /**
         * 谈一谈对于抽象工厂模式的理解
         * ===》
         * 1.抽象工厂模式的定义
         * ===》
         * 抽象工厂，简单地说是工厂的工厂，抽象工厂可以创建具体工厂，由具体工厂来产生具体产品。
         *
         * 2.抽象工厂模式的工作流程
         * ===》
         * （1）不变的是，产品类的实现，是通过继承某个产品接口;
         * （2）即，在抽象工厂接口，其中定义了所有产品类实例的创建方法;
         * （3）最后，通过实现该抽象工厂接口，来获取具体产品类实例;
         *
         */
        TotalFactory totalFactory2 = new TotalFactoryReally();
        Car2 car = totalFactory2.createChair();
        car.run();
        TotalFactory totalFactory = new TotalFactoryReally();
        Engine engine = totalFactory.createEngine();
        engine.run();
    }
}
//1.定义产品类
interface Car2 {
    void run();
}
class CarA implements Car2{
    public void run() {
        System.out.println("宝马");
    }
}
class CarB implements Car2{
    public void run() {
        System.out.println("摩拜");
    }
}
interface Engine {
    void run();
}
class EngineA implements Engine {
    public void run() {
        System.out.println("转的快!");
    }
}
class EngineB implements Engine {
    public void run() {
        System.out.println("转的慢!");
    }
}
// 2.定义抽象工厂接口（其中定义了 产品类实例的创建方法）
interface TotalFactory {
    // 创建汽车
    Car2 createChair();
    // 创建发动机
    Engine createEngine();
}
//总工厂实现类，由其决定调用哪个工厂的那个实例
class TotalFactoryReally implements TotalFactory {
    public Engine createEngine() {
        return new EngineA();
    }
    public Car2 createChair() {
        return new CarA();
    }
}
